home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / roman / roman2.bas < prev    next >
BASIC Source File  |  1994-06-01  |  13KB  |  389 lines

  1. 10 '
  2. 20 '====ローマ字仮名変換プログラム by 金子卓哉=====
  3. 30 '    (FOR FUJITSU FM TOWNS F-BASIC386 V2.1)
  4. 40 '
  5. 50 '内容
  6. 60 '   指定されたファイルを読み込み、
  7. 70 '  半角アルファベット部を仮名変換して、画面に表示する。
  8. 80 '   半角アルファベットでない部分はそのまま表示する。
  9. 90 '   アルファベットの大文字小文字の区別はしない。
  10. 100 '   入力ファイル名は、プログラム内で文字列 INPDEVICE$ に設定する。
  11. 110 '
  12. 120 '
  13. 130 '  母音 : A I U E O
  14. 140 '  子音 : K S T N H M Y R G Z D B P J (子音 + Y が許される)
  15. 150 '  子音 : W F V CH SH TS L LY
  16. 160 '
  17. 170 'ローマ字表記ルール
  18. 180 '  母音
  19. 190 '    例  A I U E O -> あ い う え お
  20. 200 '  子音1 + 母音, 子音2 + 母音
  21. 210 '    例  KA GI FU SHE LA LYA -> か ぎ ふ しゃ ぁ ゃ
  22. 220 '  子音1 + Y + 母音
  23. 230 '    例  KYA SYI TYU BYE PYO -> きゃ しぃ ちゅ びぇ ぴょ
  24. 240 '  促音「っ」 : 最初の子音を重ねる。
  25. 250 '    例  ZAKKA KAPPU BATTO -> ざっか かっぷ ばっと
  26. 260 '  撥音「ん」 : N もしくは N'
  27. 270 '    例  BANTO SIN'YA SON'NA -> ばんと しんや そんな
  28. 280 '  長音「ー」 : X (母音 もしくは N の直後)
  29. 290 '    例  PICCHAX -> ぴっちゃー
  30. 300 ' 
  31. 310 '上記以外の場合
  32. 320 '  規定外の文字は無視する
  33. 330 '    例  CA QU -> A U
  34. 340 '  N 以外の単独の子音は無視する
  35. 350 '    例  KHA STI -> HA TI
  36. 360 '
  37. 370 '注意
  38. 380 '  次の場合 N は「ん」にならないので注意
  39. 390 '    N が重なる場合
  40. 400 '    N + Y の場合
  41. 410 '    例  SONNA SINYA -> そっな しにゃ
  42. 420 '  L + 母音, L + Y + 母音 で、 小さい文字を表す
  43. 430 '    例  LA LI LU LYA LYI LYI -> ぁ ぃ ぅ ゃ ぃ ゅ
  44. 440 '    
  45. 450 '
  46. 460 '
  47. 470 '変数一覧
  48. 480 '
  49. 490 '  I, J        汎用変数
  50. 500 '  TRUE  = -1
  51. 510 '  FALSE =  0  真偽判定用 定数
  52. 520 '
  53. 530 '  INPDEVICE$  入力ファイル指定用 文字列変数
  54. 540 '
  55. 550 '  S$  一行読み込み用 文字列変数
  56. 560 '  C$  一文字読み込み用 文字列変数
  57. 570 '
  58. 580 '  CH  キャラクタコード
  59. 590 '
  60. 600 '  N1  現在処理中の文字番号
  61. 610 '  N2  一つ前の文字番号
  62. 620 '  N3  二つ前の文字番号
  63. 630 '
  64. 640 '      N1 : A=0 から 「文字コードデータ」部の順に割り当てる
  65. 650 '      N2, N3 には、 N1 が順送りされていく。
  66. 660 '
  67. 670 '  ST  現在の状態を表す変数
  68. 680 '
  69. 690 '      ST = 0  変換直後。 N1 のみ考慮すればよい。
  70. 700 '      ST = 1  一文字保留中。 N2 と N1 を考慮する。
  71. 710 '      ST = 2  二文字保留中。 N3 と N2 と N1 を考慮する。
  72. 720 '
  73. 730 '  ATTR(Nn)    文字属性用 配列       Nn:文字番号
  74. 740 '
  75. 750 '      ATTR(Nn) = 0  母音
  76. 760 '                 1  子音
  77. 770 '                 2  その他
  78. 780 '
  79. 790 '  CODE(Nn)    文字コード用 配列     Nn:文字番号
  80. 800 '
  81. 810 '      規定の文字コードを表す。
  82. 820 '
  83. 830 '  KANA$(Cs,Cb)   変換表用 文字列配列
  84. 840 '      Cs:子音の文字コード, Cb:母音の文字コード
  85. 850 '      子音と母音の文字コードに対応する、 仮名文字列
  86. 860 '
  87. 870 '
  88. 880 '----データ部----
  89. 890 '
  90. 900 *ZOKUSEI'    文字属性データ(0:母音 1:子音 2:特例 3:その他)
  91. 910 '     A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P ' 文字番号 0~15
  92. 920 DATA  0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 ' 文字属性
  93. 930 '     Q  R  S  T  U  V  W  X  Y  Z  ' CH SH TS LY 他 ' 文字番号16~31
  94. 940 DATA  2, 1, 1, 1, 0, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 3 ' 文字属性
  95. 950 '
  96. 960 *MOJICODE'   文字コードデータ
  97. 970 '     A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P ' 文字番号 0~15
  98. 980 DATA  0,12,23,11, 3,16, 9, 5, 1,14, 1,21, 6, 4, 4,13 ' 文字コード
  99. 990 '     Q  R  S  T  U  V  W  X  Y  Z  ' CH SH TS LY 他 ' 文字番号16~31
  100. 1000 DATA 24, 8, 2, 3, 2,17,15,25, 7,10,26,18,19,20,22,27 ' 文字コード
  101. 1010 '
  102. 1020 *HENKANHYOU' 変換表データ(数字は文字コード)
  103. 1030 '     A    I    U    E    O
  104. 1040 '     0    1    2    3    4
  105. 1050 DATA あ  ,い  ,う  ,え  ,お   ' 0 A
  106. 1060 DATA か  ,き  ,く  ,け  ,こ   ' 1 K  ここから
  107. 1070 DATA さ  ,し  ,す  ,せ  ,そ   ' 2 S
  108. 1080 DATA た  ,ち  ,つ  ,て  ,と   ' 3 T
  109. 1090 DATA な  ,に  ,ぬ  ,ね  ,の   ' 4 N
  110. 1100 DATA は  ,ひ  ,ふ  ,へ  ,ほ   ' 5 H
  111. 1110 DATA ま  ,み  ,む  ,め  ,も   ' 6 M
  112. 1120 DATA や  ,い  ,ゆ  ,いぇ,よ   ' 7 Y
  113. 1130 DATA ら  ,り  ,る  ,れ  ,ろ   ' 8 R
  114. 1140 DATA が  ,ぎ  ,ぐ  ,げ  ,ご   ' 9 G
  115. 1150 DATA ざ  ,じ  ,ず  ,ぜ  ,ぞ   '10 Z
  116. 1160 DATA だ  ,ぢ  ,づ  ,で  ,ど   '11 D
  117. 1170 DATA ば  ,び  ,ぶ  ,べ  ,ぼ   '12 B
  118. 1180 DATA ぱ  ,ぴ  ,ぷ  ,ぺ  ,ぽ   '13 P
  119. 1190 DATA じゃ,じ  ,じゅ,じぇ,じょ '14 J  ここまでが子音1
  120. 1200 DATA わ  ,うぃ,う  ,うぇ,を   '15 W
  121. 1210 DATA ふぁ,ふぃ,ふ  ,ふぇ,ふぉ '16 F
  122. 1220 DATA ぁ,ぃ,  ,ぇ,ぉ '17 V
  123. 1230 DATA ちゃ,ち  ,ちゅ,ちぇ,ちょ '18 CH
  124. 1240 DATA しゃ,し  ,しゅ,しぇ,しょ '19 SH
  125. 1250 DATA さ  ,し  ,つ  ,せ  ,そ   '20 TS
  126. 1260 DATA   ぁ,  ぃ,  ぅ,  ぇ,  ぉ '21 L
  127. 1270 DATA   ゃ,  ぃ,  ゅ,  ぇ,  ょ '22 LY
  128. 1280 DATA あ  ,い  ,う  ,え  ,お   '23 C
  129. 1290 DATA あ  ,い  ,う  ,え  ,お   '24 Q 
  130. 1300 '                        以後  25 X  26 '  27 その他
  131. 1310 '
  132. 1320 '----初期設定----
  133. 1330 '
  134. 1340 SCREEN@ 0 : CLS ' 画面設定
  135. 1350 DEFINT A-Z
  136. 1360 ON KEY(1) GOSUB *END : ON ERROR GOTO *ERR ' 割り込み処理設定
  137. 1370 '
  138. 1380 TRUE = -1 : FALSE = 0 ' 真偽判定用定数
  139. 1390 '
  140. 1400 '配列宣言
  141. 1410 ATTRMAX = 31 : CODEMAX = 31 : BOINMAX = 4 : SIINMAX = 24
  142. 1420 DIM ATTR(ATTRMAX), CODE(CODEMAX), KANA$(SIINMAX, BOINMAX)
  143. 1430 '
  144. 1440 '各配列にデータを読み込む
  145. 1450 RESTORE *ZOKUSEI
  146. 1460 FOR I=0 TO ATTRMAX
  147. 1470   READ ATTR(I)       '文字属性
  148. 1480 NEXT
  149. 1490 RESTORE *MOJICODE
  150. 1500 FOR I=0 TO CODEMAX
  151. 1510   READ CODE(I)       '文字コード
  152. 1520 NEXT
  153. 1530 RESTORE *HENKANHYOU
  154. 1540 FOR J=0 TO SIINMAX
  155. 1550   FOR I=0 TO BOINMAX
  156. 1560     READ KANA$(J, I)  '変換表
  157. 1570   NEXT
  158. 1580 NEXT
  159. 1590 '
  160. 1600 '----メインプログラム----
  161. 1610 '
  162. 1620 *START
  163. 1630 '
  164. 1640 MOUSE 0 ' マウス機能初期化
  165. 1650 KEY(1) ON ' 割り込み開始
  166. 1660 '
  167. 1670 GOSUB *INPUTFILE ' ファイル名入力ルーチンへ
  168. 1680 '
  169. 1690 OPEN "I", #1, INPDEVICE$ ' ファイルオープン(既存, 入力モード )
  170. 1700 '
  171. 1710 GOSUB *CAUTION ' 注意表示
  172. 1720 '
  173. 1730 '以下, ファイルの終わりまで繰り返す
  174. 1740 WHILE (EOF(1) = FALSE) AND (INKEY$ = "")
  175. 1750   '
  176. 1760   LINE INPUT #1, S$ ' 一行読み込み
  177. 1770   ST=0
  178. 1780   '
  179. 1790   '空行でなければ以下実行
  180. 1800   IF (KLEN(S$,0) > 0) THEN
  181. 1810     '
  182. 1820     '以下, 一文字目から一行の終わりまで繰り返す
  183. 1830     FOR I=1 TO KLEN(S$,0)
  184. 1840       '
  185. 1850       C$ = KMID$(S$,I,1) ' I文字目読み込み
  186. 1860       CH = ASC(C$) ' キャラクタコードを求める
  187. 1870       '
  188. 1880       GOSUB *CH_TO_N1 ' 規定の文字番号を求める
  189. 1890       '
  190. 1900       '状態によって分岐
  191. 1910       ON ST+1 GOSUB *HENKAN1, *HENKAN2, *HENKAN3
  192. 1920       '
  193. 1930       N3 = N2 : N2 = N1 ' 次の文字へ
  194. 1940       '
  195. 1950       'マウスが押されていたらリリース待ち
  196. 1960       WHILE (MOUSE(2,0) = TRUE) : WEND
  197. 1970       '
  198. 1980     NEXT
  199. 1990     '
  200. 2000   ENDIF
  201. 2010   '
  202. 2020   PRINT ' 一行終わったので改行
  203. 2030 WEND
  204. 2040 '
  205. 2050 CLOSE ' ファイルクローズして初めに戻る
  206. 2060 COLOR 5 : PRINT : PRINT "変換終了です。"
  207. 2070 GOTO *START
  208. 2080 '
  209. 2090 '
  210. 2100 '---以下、 サブルーチン---
  211. 2110 '
  212. 2120 '一文字目
  213. 2130 *HENKAN1
  214. 2140   IF (ATTR(N1) = 0) THEN ' 母音の場合
  215. 2150     PRINT KANA$(0, CODE(N1)); ' そのまま変換して変換終了
  216. 2160     ST = 0
  217. 2170   ELSE IF (ATTR(N1) = 1) THEN ' 子音の場合
  218. 2180     ST = 1 ' 通常は一文字保留だが
  219. 2190     IF (I = KLEN(S$,0)) AND (N1 = 13) THEN
  220. 2200       PRINT "ん"; ' 文末で「N」の場合のみ「ん」を出力して変換終了
  221. 2210       ST = 0
  222. 2220     ENDIF
  223. 2230   ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
  224. 2240     IF (N1 = 23) THEN ' 「X」の場合は「ー」を出力し
  225. 2250       PRINT "ー"; 
  226. 2260     ELSE IF (N1 = 26) THEN ' 「'」の場合はそのまま出力し
  227. 2270       PRINT C$;
  228. 2280     ENDIF ' 「Q」の場合は何もしないで
  229. 2290     ST = 0 ' 変換終了
  230. 2300   ELSE ' アルファベットでない文字の場合
  231. 2310     PRINT C$; ' そのまま出力して変換終了
  232. 2320     ST = 0
  233. 2330   ENDIF
  234. 2340 RETURN
  235. 2350 '
  236. 2360 '二文字目(子音 + 二文字目)
  237. 2370 *HENKAN2
  238. 2380   IF (ATTR(N1) = 0) THEN ' 母音の場合
  239. 2390     PRINT KANA$(CODE(N2), CODE(N1)); ' 子音と併せて変換して出力
  240. 2400     ST = 0
  241. 2410   ELSE IF (ATTR(N1) = 1) THEN ' 二文字目も子音の場合
  242. 2420     IF (N2 = N1) THEN ' 同じ子音の繰り返しなら
  243. 2430       PRINT "っ"; ' 「っ」を出力して一文字保留
  244. 2440       ST = 1
  245. 2450     ELSE IF (N2 = 2) AND (N1 = 7) THEN ' 「C + H」の場合は
  246. 2460       N1 = 27 ' 子音を「CH」にして一文字保留
  247. 2470       ST = 1
  248. 2480     ELSE IF (N2 = 18) AND (N1 = 7) THEN ' 「S + H」の場合は
  249. 2490       N1 = 28 ' 子音を「SH」にして一文字保留
  250. 2500       ST = 1
  251. 2510     ELSE IF (N2 = 19) AND (N1 = 18) THEN ' 「T + S」の場合は
  252. 2520       N1 = 29 ' 子音を「TS」にして一文字保留
  253. 2530       ST = 1
  254. 2540     ELSE IF (N2 = 11) AND (N1 = 24) THEN ' 「L + Y」の場合は
  255. 2550       N1 = 30 ' 子音を「LY」にして一文字保留
  256. 2560       ST = 1
  257. 2570     ELSE ' それ以外の「子音 + 子音」の場合は
  258. 2580       ST = 2 ' 通常は二文字保留だが
  259. 2590       IF (I = KLEN(S$,0)) AND (CODE(N2) = 4) THEN
  260. 2600         PRINT "ん"; ' 「N+子音」が文末の場合のみ「ん」を出力して変換終了
  261. 2610         ST = 0
  262. 2620       ENDIF
  263. 2630     ENDIF
  264. 2640     IF (I = KLEN(S$,0)) AND (CODE(N1) = 4) THEN
  265. 2650       PRINT "ん"; ' 「N」が文末の場合には「ん」を出力して変換終了
  266. 2660       ST = 0
  267. 2670     ENDIF
  268. 2680   ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
  269. 2690     IF (N2 = 13) THEN ' 一文字目が「N」なら
  270. 2700       PRINT "ん"; ' 「ん」を出力し
  271. 2710       IF (N1 = 23) THEN ' 二文字目が「X」なら
  272. 2720         PRINT "ー"; ' 「ー」を出力して
  273. 2730       ENDIF
  274. 2740     ENDIF
  275. 2750     ST = 0 ' 変換終了
  276. 2760   ELSE ' アルファベットでない場合
  277. 2770     IF (N2 = 13) THEN ' 一文字目が「N」なら
  278. 2780       PRINT "ん"; ' 「ん」を出力し
  279. 2790     ENDIF
  280. 2800     PRINT C$; ' そのまま出力して変換終了
  281. 2810     ST = 0
  282. 2820   ENDIF
  283. 2830 RETURN
  284. 2840 '
  285. 2850 '三文字目(子音 + 子音 + 三文字目)
  286. 2860 *HENKAN3
  287. 2870   IF (ATTR(N1) = 0) THEN ' 母音の場合
  288. 2880     IF ((1 <= CODE(N3)) AND (CODE(N3) <= 14)) AND (N2 = 24) THEN
  289. 2890       ' 「子音1 + Y + 母音」の場合  例  KYA -> KI + LYA -> きゃ
  290. 2900       PRINT KANA$(CODE(N3), 1) + KANA$(22, CODE(N1));
  291. 2910     ELSE ' それ以外の場合は一文字目は無視するが
  292. 2920       IF (N3 = 13) THEN ' 一文字目が「N」なら
  293. 2930         PRINT "ん"; ' 「ん」を出力し
  294. 2940       ENDIF
  295. 2950       PRINT KANA$(CODE(N2), CODE(N1)); ' 「子音 + 母音」を出力して
  296. 2960     ENDIF
  297. 2970     '変換終了
  298. 2980     ST = 0
  299. 2990   ELSE IF (ATTR(N1) = 1) THEN ' 子音の場合
  300. 3000     ST = 2 ' 通常は最初の子音は切り捨てて二文字保留
  301. 3010     IF (N3 = 13) THEN '一文字目が「N」の場合のみ
  302. 3020       PRINT "ん"; ' 「ん」を出力
  303. 3030     ENDIF
  304. 3040     IF (N2 = N1) THEN ' 同じ子音の繰り返しなら
  305. 3050       PRINT "っ"; ' 「っ」を出力して一文字保留
  306. 3060       ST = 1
  307. 3070     ELSE IF (N2 = 2) AND (N1 = 7) THEN ' 「C + H」の場合は
  308. 3080       N1 = 18 ' 子音「CH」一文字のみ保留
  309. 3090       ST = 1
  310. 3100     ELSE IF (N2 = 18) AND (N1 = 7) THEN ' 「S + H」の場合は
  311. 3110       N1 = 19 ' 子音「SH」一文字のみ保留
  312. 3120       ST = 1
  313. 3130     ELSE IF (N2 = 19) AND (N1 = 18) THEN ' 「T + S」の場合は
  314. 3140       N1 = 20 ' 子音「TS」一文字のみ保留
  315. 3150       ST = 1
  316. 3160     ELSE IF (N2 = 11) AND (N1 = 24) THEN ' 「L + Y」の場合は
  317. 3170       N1 = 21 ' 子音「LY」一文字のみ保留
  318. 3180       ST = 1
  319. 3190     ENDIF
  320. 3200     IF (I = KLEN(S$,0)) AND (N1 = 13) THEN ' 「N」が文末の場合は
  321. 3210       PRINT "ん"; ' 「ん」を出力して変換終了
  322. 3220       ST = 0
  323. 3230     ENDIF
  324. 3240   ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
  325. 3250     IF (N3 = 13) THEN ' 一文字目が「N」の場合「ん」を出力
  326. 3260       PRINT "ん";
  327. 3270     ENDIF
  328. 3280     IF (N2 = 13) THEN ' 二文字目が「N」の場合「ん」を出力
  329. 3290       PRINT "ん";
  330. 3300     ENDIF
  331. 3310     ST = 0 ' 変換終了
  332. 3320   ELSE ' アルファベットでない場合
  333. 3330     IF (N3 = 13) THEN ' 一文字目が「N」の場合「ん」を出力
  334. 3340       PRINT "ん";
  335. 3350     ENDIF
  336. 3360     IF (N2 = 13) THEN ' 二文字目が「N」の場合「ん」を出力
  337. 3370       PRINT "ん";
  338. 3380     ENDIF
  339. 3390     PRINT C$; ' そのまま出力して変換終了
  340. 3400     ST = 0 
  341. 3410   ENDIF
  342. 3420 RETURN
  343. 3430 '
  344. 3440 'キャラクタコードから、 規定の文字番号を求める
  345. 3450 *CH_TO_N1
  346. 3460   IF (ASC("A") <= CH) AND (CH <= ASC("Z")) THEN ' 大文字
  347. 3470     N1 = CH - ASC("A")
  348. 3480   ELSE IF (ASC("a") <= CH) AND (CH <= ASC("z")) THEN ' 小文字
  349. 3490     N1 = CH - ASC("a")
  350. 3500   ELSE IF (CH = ASC("'")) THEN ' 「'」
  351. 3510     N1 = 26
  352. 3520   ELSE ' アルファベットでない文字
  353. 3530     N1 = 31
  354. 3540   ENDIF
  355. 3550 RETURN
  356. 3560 '
  357. 3570 '入力ファイル名指定
  358. 3580 *INPUTFILE
  359. 3590   PRINT : COLOR 4
  360. 3600   PRINT "ローマ字仮名変換プログラム(真面目版) by たくりん"
  361. 3610   COLOR 7 : PRINT "マウス左クリック待ちです";
  362. 3620   PRINT "([CTRL]+[ESC]→サイドワーク,[PF 1]→終了)。"
  363. 3630   PRINT "準備が出来たら左クリックして下さい(カーソルが現れます)。"
  364. 3640   PRINT "INPUT FILE ? >";
  365. 3650   WHILE (MOUSE(2,0) = FALSE) : WEND
  366. 3660   LINE INPUT INPDEVICE$
  367. 3670 RETURN
  368. 3680 '
  369. 3690 '注意表示
  370. 3700 *CAUTION
  371. 3710   COLOR 5 : PRINT
  372. 3720   PRINT "マウスの左ボタンを押している間表示が止まります。";
  373. 3730   PRINT "また、何かキーを押すと中断し、最初に戻ります。"
  374. 3740   PRINT : COLOR 7
  375. 3750 RETURN
  376. 3760 '
  377. 3770 'エラー時
  378. 3780 *ERR
  379. 3790   CLOSE : COLOR 2 : PRINT
  380. 3800   PRINT "何かエラーが起きました。 エラー番号";ERR;"エラー行";ERL
  381. 3810 RESUME *START
  382. 3820 '
  383. 3830 '終了
  384. 3840 *END
  385. 3850   CLOSE : MOUSE 5
  386. 3860   COLOR 5 : PRINT : PRINT : PRINT "終了します。" : COLOR 7
  387. 3870 END
  388. 3880 '
  389.